Streamlit in Snowflake が AWS PrivateLink に対応したので試してみた #SnowflakeDB

Streamlit in Snowflake が AWS PrivateLink に対応したので試してみた #SnowflakeDB

Clock Icon2024.10.25

はじめに

2024年10月のアップデートで Streamlit in Snowflake の AWS PrivateLink のサポートがパブリックプレビューとなりました。 こちらの機能を試してみましたので本記事で内容をまとめます。

https://docs.snowflake.com/en/release-notes/streamlit-in-snowflake

Snowflake では Streamlit in Snowflake として Snowflake の GUI 画面である Snowsight 上で Streamlit のアプリ開発と実行が可能です。

また Snowflake は各クラウドサービスのプライベート接続に対応しており、AWS であれば PrivateLink を使用できます。これにより、ユーザーは自身の管理する VPC と Snowflake アカウント間をパブリックなインターネットを介さずに接続できます。

これまでは Streamlit in Snowflake で Privatelink がサポートされていなかったため、Privatelink 経由で Snowsight 上でアプリの実行や開発を行うことができませんでしたが、今回のアップデートでこれに対応できるようになります。

前提条件

以下の構成で検証を行いました。

  • Snowflake
    • Business Ciritical
      • PrivateLink の設定には Business Ciritical 以上のエディションが必要
    • クラウドリージョン:AWS_AP_NORTHEAST_1
  • AWS
    • Snowflake アカウントと同一のリージョンに VPC を作成

事前準備

Streamlit in Snowflake 用のプライベート接続設定のためには、前提として Snowflake アカウントに対して AWS PrivateLink 設定を行っておく必要があります。ここでは内部ステージへのアクセス方法としてゲートウェイ型のエンドポイントを使用する構成で検証を行いました。
設定後、対象の VPC から Snowsight にプライベート接続用の URL でアクセスできるか確認しておきます。

Snowflake アカウントの AWS PrivateLink 設定手順は以下をご参照ください。

https://docs.snowflake.com/en/user-guide/admin-security-privatelink

https://dev.classmethod.jp/articles/snowflake-aws-privatelink-snowflakedb/

Streamlit アプリの作成

以下のコマンドでサンプルの Streamlit アプリの作成先となるデータベース、アプリ作成用のロールを用意しておきました。

--データベースを作成
USE ROLE SYSADMIN;
CREATE DATABASE st_database;

--roleの作成
USE ROLE USERADMIN;
CREATE ROLE streamlit_creator;

--権限の付与
USE ROLE SECURITYADMIN;
----ロール階層
GRANT ROLE streamlit_creator TO ROLE SYSADMIN;

----ウェアハウス
GRANT USAGE ON WAREHOUSE compute_wh TO ROLE streamlit_creator;

----streamlit権限
GRANT USAGE ON SCHEMA st_database.public TO ROLE streamlit_creator;
GRANT USAGE ON DATABASE st_database TO ROLE streamlit_creator;
GRANT CREATE STREAMLIT ON SCHEMA st_database.public TO ROLE streamlit_creator;
GRANT CREATE STAGE ON SCHEMA st_database.public TO ROLE streamlit_creator;

GUI からアプリを作成

image

アプリの中身はデフォルトで用意されているサンプルコードのままとしました。

image 1

Streamlit in Snowflake へのプライベート接続設定を行う

Streamlit in Snowflake のプライベート接続の構成手順は以下に記載があります。

https://docs.snowflake.com/en/developer-guide/streamlit/privatelink

構成前の状態

事前準備後、Snowsight にプライベート接続します。この時点で Streamlit アプリを開こうとしても下図のようにエラーとなります。

image 2

新規のアプリを構築しようとした場合、アプリ自体(オブジェクト)は作成されますが、表示はできない状態でした。

image 3

オブジェクトは作成されます。

image 4

image 5

DNS 設定

Snowflake 側でSYSTEM$GET_PRIVATELINK_CONFIG を実行します。

USE ROLE ACCOUNTADMIN;
SELECT SYSTEM$GET_PRIVATELINK_CONFIG();

出力は以下のようになっており、Snowflake へのプライベート接続用の URL などの情報を返してくれます。

{
	"privatelink-account-principal":"arn:aws:iam::xxxxxxxxxxxx:root",
	"regionless-snowsight-privatelink-url":"app-<organization>-<account>.privatelink.snowflakecomputing.com",
	"privatelink-account-name":"<アカウント識別子>.ap-northeast-1.privatelink",
	"privatelink-vpce-id":"com.amazonaws.vpce.ap-northeast-1.vpce-svc-xxxxx",
	"snowsight-privatelink-url":"app.ap-northeast-1.privatelink.snowflakecomputing.com",
	"regionless-privatelink-ocsp-url":"ocsp.<組織名>-<アカウント名>.privatelink.snowflakecomputing.com",
	"privatelink-account-url":"<アカウント識別子>.ap-northeast-1.privatelink.snowflakecomputing.com",
	"app-service-privatelink-url":"*.xxxxx.privatelink.snowflake.app",
	"regionless-privatelink-account-url":"<組織名>-<アカウント名>.privatelink.snowflakecomputing.com",
	"privatelink_ocsp-url":"ocsp.<アカウント識別子>.ap-northeast-1.privatelink.snowflakecomputing.com"
}

Streamlit in Snowflake のプライベート接続構成には、このうちapp-service-privatelink-url を使用します。この値が Streamlit アプリケーションへのトラフィックを AWS PrivateLink 経由でルーティングするために必要なワイルドカード URL として使用されるようです。

*.xxxxx.privatelink.snowflake.app

VPC 内から上記の URL に名前解決するためにここでは以下の設定を AWS 側で行いました。

  • privatelink.snowflake.app のプライベートホストゾーンを作成
  • CNAME レコードとして*.xxxxx.privatelink.snowflake.app を追加
    • 値は事前準備で Snowflake アカウントへのプライベート接続用に作成した既存の VPC エンドポイントの DNS 名

image 6

レコード追加後、Snowsight から Streamlit アプリを開くと下図のようにアプリが表示されました。

image 7

この際、ブラウザ上の URL は https://app.ap-northeast-1.privatelink.snowflakecomputing.com///#/streamlit-appsからなる URL が表示されました。
ドキュメントの引用を日本語訳したものですが、以下のように記載があり、内部的に Streamlit 固有の URL にリダイレクトされるようです。

Snowflake の Streamlit は、特定のセキュリティ要件に合わせて別の URL スキームを使用します。Streamlit URL には独自のトップレベル ドメインがあり、Snowsight と共有される要素はありません。各 Streamlit アプリには固有のオリジンがあります。

試しに簡単にコードを変更してみたりしましたが、変更内容の反映を確認しつつ、通常の URL からも変更された内容を確認できました。

image 8

アプリの共有

プライベート接続時にアプリの共有を行うと共有リンクとしてもプライベート接続用の URL が使用されます。

image 9

さいごに

Streamlit in Snowflake の AWS PrivateLink 設定を試してみました。Streamlit in Snowflake のアプリをプライベート接続経由で表示するには既存の構成に加えて追加の設定が必要となるためご注意ください。こちらの内容が何かの参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.